package com.shenjun.bank.config;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class ExecutorServiceConfig {

    /**
     * 定义一个并发任务执行器服务
     */
    private static ExecutorService executorService;
    /**
     * 在类加载的时候初始化并发任务执行器
     */
    static {
        init();
    }

    /**
     * 防止类属性被篡改
     */
    private ExecutorServiceConfig() {
    }

    /**
     * 初始化并发任务执行器。核心线程数量：设置为2，初始创建的线程池大小；最大线程数量：设置为3；空闲线程存活时间：设置为3秒，当非核心线程执行完任务之后，若没有新的任务分派，存活多久后自动销毁；任务队列：设置为2，当线程池创建的线程数量达到最大线程数量后，新进来的任务会排队等候；
     * 拒绝策略：设置为直接抛异常
     * <p>
     * 以上配置需要根据：实际的业务场景、项目实际情况、实际硬件情况等各种因素综合考量
     */
    private static void init() {
        executorService = Executors.newFixedThreadPool(8);
//        executorService = new ThreadPoolExecutor(3, 4, 3,
//                TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(1000), new ThreadPoolExecutor.CallerRunsPolicy());
    }

    /**
     * 获取默认并发任务执行器
     *
     * @return
     */
    public static ExecutorService getDefaultExecutor() {
        return executorService;
    }

    /**
     * 获取固定大小并发任务执行器
     *
     * @return
     */
    public static ExecutorService getFixedExecutor() {
        return Executors.newFixedThreadPool(10);
    }

    /**
     * 获取其他并发任务执行器
     * @return
     */
    public static ExecutorService getOtherExecutor() {
        //todo
        return null;
    }
}
